MongoDBにTLS/SSLで接続する
こんにちは、菊池です。
MongoDB に接続する際にTLS/SSLを有効にする方法を調べてみました。
概要
クライアントがMongoDBへ接続する際の通信をTLS/SSLで暗号化します。クライアント認証/サーバ認証を行うことも可能ですが、今回は暗号化のみが目的ということで自己署名証明書を作成して実施しました。
詳細は公式ドキュメントを併せて参照してください。
環境はAmazon Linux、MongoDBはバージョン3.4.2を使用しています。
また、前提としてopensslがインストールされている必要があります。(Amazon Linuxはインストール済み)
やってみた
1. MongoDBインストール
まずはMongoDBをインストールします。yumでインストールするため、/etc/yum.repos.d/mongodb-org-3.4.repo
に以下を記述します。
[mongodb-org-3.4] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/amazon/2013.03/mongodb-org/3.4/x86_64/ gpgcheck=1 enabled=1 gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc
yumコマンドでMongoDB一式をインストールします。
# yum install -y mongodb-org
2. 秘密鍵/証明書の作成
opensslで秘密鍵と証明書を作成します。
# cd /etc/ssl/ # openssl req -newkey rsa:2048 -new -x509 -days 365 -nodes -out mongodb-cert.crt -keyout mongodb-cert.key
作成した秘密鍵/証明書を結合してpemファイルを作成します。
# cat mongodb-cert.key mongodb-cert.crt > mongodb.pem
3. MongoDBの設定・起動
続いてMongoDB側の設定です。設定ファイル/etc/mongod.conf
を以下のように記述しました。
systemLog: destination: file logAppend: true path: /var/log/mongodb/mongod.log storage: dbPath: /data/db journal: enabled: true processManagement: fork: true # fork and run in background pidFilePath: /var/run/mongodb/mongod.pid # location of pidfile net: port: 27017 ssl: mode: requireSSL PEMKeyFile: /etc/ssl/mongodb.pem
net:
の項目でSSLを必須として、作成したpemファイルを指定します。
準備ができたらサーバを起動します。
# service mongod start Starting mongod: [ OK ]
4. クライアントから接続
クライアントからmongoshellで接続します。TLS/SSLを使う場合には--ssl
を使用します。また、今回は自己署名証明書を使うため、証明書の検証でエラーとならないよう、--sslAllowInvalidCertificates
をつけて接続します。
$ mongo --ssl --host 172.31.28.253 --sslAllowInvalidCertificates MongoDB shell version v3.4.2 connecting to: mongodb://172.31.28.253:27017/ 2017-02-26T04:08:00.738+0000 W NETWORK [thread1] SSL peer certificate validation failed: self signed certificate 2017-02-26T04:08:00.738+0000 W NETWORK [thread1] The server certificate does not match the host name. Hostname: 172.31.28.253 does not match CN: mongo.local MongoDB server version: 3.4.2 Welcome to the MongoDB shell. For interactive help, type "help". For more comprehensive documentation, see http://docs.mongodb.org/ Questions? Try the support group http://groups.google.com/group/mongodb-user Server has startup warnings: 2017-02-26T04:05:15.194+0000 I STORAGE [initandlisten] 2017-02-26T04:05:15.194+0000 I STORAGE [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine 2017-02-26T04:05:15.194+0000 I STORAGE [initandlisten] ** See http://dochub.mongodb.org/core/prodnotes-filesystem 2017-02-26T04:05:15.237+0000 I CONTROL [initandlisten] 2017-02-26T04:05:15.237+0000 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database. 2017-02-26T04:05:15.237+0000 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted. 2017-02-26T04:05:15.237+0000 I CONTROL [initandlisten] 2017-02-26T04:05:15.237+0000 I CONTROL [initandlisten] 2017-02-26T04:05:15.237+0000 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'. 2017-02-26T04:05:15.237+0000 I CONTROL [initandlisten] ** We suggest setting it to 'never' 2017-02-26T04:05:15.237+0000 I CONTROL [initandlisten] > > version() 3.4.2 >
署名書の警告などが出ていますが、接続できました!
最後に
今回はmongoshellを利用して接続しましたが、アプリケーションで実装する場合には各言語のドライバーを参照しましょう。
MongoDBへのアクセスをTLS/SSLで暗号化することで、インターネットを経由する場合などでも盗聴リスクを軽減することができます。ただし、MongoDBやopensslの脆弱性による攻撃リスクなどもありますので、DBを直接インターネットに開放するのはできるだけ避けるのがよいでしょう。やむをえず直接開放する場合には、IPアドレス制限や適切な認証を組みわせることで安全性を高めましょう。